#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/10/29 21:34
# @Author  : summer
# @Email   : 610658552@qq.com
# @File    : ser_sms_provider.py
# @Software: PyCharm
# @Desc    : SMSProvider序列化器
import re

from rest_framework import serializers

from ssms.models import SMSProvider


class SMSProviderSerializer(serializers.ModelSerializer):
    """
    SMSProvider序列化器：
    - 新增/更新时校验必填字段
    - 基础字段格式验证
    """
    # 时间字段格式化
    create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
    update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)

    class Meta:
        model = SMSProvider
        fields = [
            "id", "sms_name", "sms_key", "sms_secret",
            "sms_description", "sort_num", "is_active",
            "create_time", "update_time"
        ]
        read_only_fields = ["id", "create_time", "update_time"]

    def validate_sms_name(self, value):
        """校验供应商名称唯一性"""
        value = value.strip()
        if not value:
            raise serializers.ValidationError("供应商名称不能为空")

        queryset = SMSProvider.objects.filter(is_delete=0, pt_flag=0)
        if self.instance is None:  # 新增
            if queryset.filter(sms_name=value).exists():
                raise serializers.ValidationError(f"供应商名称「{value}」已存在")
        else:  # 更新
            if queryset.exclude(id=self.instance.id).filter(sms_name=value).exists():
                raise serializers.ValidationError(f"供应商名称「{value}」已存在")
        return value

    def validate_sms_key(self, value):
        """
        校验API Key：
        - 非空
        - 长度16-64位（符合多数平台规范）
        - 全局唯一（区分大小写，排除已删除数据）
        """
        value = value.strip()
        if not value:
            raise serializers.ValidationError("API Key不能为空")
        if not (16 <= len(value) <= 64):
            raise serializers.ValidationError("API Key长度必须在16-64位之间")
        # 允许字母、数字、下划线及特殊符号（多数平台支持）
        if not re.match(r'^[\w\-+=/]+$', value):
            raise serializers.ValidationError("API Key包含无效字符（支持字母、数字、_、-、+、=、/）")

        queryset = SMSProvider.objects.filter(is_delete=0, pt_flag=0)
        if self.instance is None:  # 新增
            if queryset.filter(sms_key=value).exists():
                raise serializers.ValidationError(f"API Key「{value}」已被使用，请更换")
        else:  # 更新
            if queryset.exclude(id=self.instance.id).filter(sms_key=value).exists():
                raise serializers.ValidationError(f"API Key「{value}」已被使用，请更换")
        return value

    def validate_sms_secret(self, value):
        """
        校验API Secret：
        - 非空
        - 长度16-128位（符合多数平台规范）
        - 全局唯一（区分大小写，排除已删除数据）
        """
        value = value.strip()
        if not value:
            raise serializers.ValidationError("API Secret不能为空")
        if not (16 <= len(value) <= 128):
            raise serializers.ValidationError("API Secret长度必须在16-128位之间")
        # 允许字母、数字、下划线及特殊符号
        if not re.match(r'^[\w\-+=/]+$', value):
            raise serializers.ValidationError("API Secret包含无效字符（支持字母、数字、_、-、+、=、/）")

        queryset = SMSProvider.objects.filter(is_delete=0, pt_flag=0)
        if self.instance is None:  # 新增
            if queryset.filter(sms_secret=value).exists():
                raise serializers.ValidationError(f"API Secret「{value}」已被使用，请更换")
        else:  # 更新
            if queryset.exclude(id=self.instance.id).filter(sms_secret=value).exists():
                raise serializers.ValidationError(f"API Secret「{value}」已被使用，请更换")
        return value

    def validate(self, data):
        """新增场景必传字段校验"""
        if self.instance is None:  # 新增
            required_fields = ["sms_name", "sms_key", "sms_secret"]
            missing = [f for f in required_fields if f not in data]
            if missing:
                raise serializers.ValidationError(f"缺少必填字段：{', '.join(missing)}")
        return data
